package com.dongdong.utils;

import java.io.IOException;

/**
 * @author dongdong 抖音号：W13883155245
 * @version 1.0
 * @date 2025/5/28
 * @description 启动和关闭 minio
 */
public class MinioProcessStarter {
    private static Process minioProcess;

    public static synchronized void startMinio() {
        if (minioProcess != null && minioProcess.isAlive()) {
            System.out.println("MinIO 服务已在运行中...");
            return;
        }

        try {
            // 构建MinIO启动命令
            ProcessBuilder pb = new ProcessBuilder(
                    "D:\\devtool\\minio\\minio.exe",
                    "server",
                    "D:\\devtool\\minio\\data\\data1",
                    "D:\\devtool\\minio\\data\\data2",
                    "D:\\devtool\\minio\\data\\data3",
                    "D:\\devtool\\minio\\data\\data4"
            );

            // 设置环境变量
            pb.environment().put("MINIO_ROOT_USER", "minioadmin");
            pb.environment().put("MINIO_ROOT_PASSWORD", "minioadmin");

            // 添加控制台地址参数
            pb.command().add("--console-address");
            pb.command().add(":9001");

            // 重定向输出流以便查看服务日志
            pb.inheritIO();

            // 启动进程
            minioProcess = pb.start();
            System.out.println("MinIO 服务已启动，PID: " + getProcessId(minioProcess));

            // 启动监控线程，在进程结束时更新状态
            new Thread(() -> {
                try {
                    int exitCode = minioProcess.waitFor();
                    System.out.println("MinIO 服务已停止，退出代码: " + exitCode);
                    minioProcess = null;
                } catch (InterruptedException e) {
                    System.err.println("监控线程被中断: " + e.getMessage());
                    Thread.currentThread().interrupt();
                }
            }).start();

        } catch (IOException e) {
            System.err.println("启动 MinIO 服务时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 关闭 MinIO 服务
     */
    public static synchronized void stopMinio() {
        if (minioProcess == null || !minioProcess.isAlive()) {
            System.out.println("MinIO 服务未运行...");
            return;
        }

        try {
            System.out.println("正在关闭 MinIO 服务...");

            // 尝试温和终止
            minioProcess.destroy();

            // 等待5秒让进程优雅退出
            if (!minioProcess.waitFor(5, java.util.concurrent.TimeUnit.SECONDS)) {
                // 强制终止
                System.out.println("MinIO 未在5秒内关闭，正在强制终止...");
                minioProcess.destroyForcibly();

                // 再等待5秒
                if (!minioProcess.waitFor(5, java.util.concurrent.TimeUnit.SECONDS)) {
                    System.err.println("警告: MinIO 服务未能被终止");
                }
            }

            System.out.println("MinIO 服务已成功关闭");
            minioProcess = null;

        } catch (InterruptedException e) {
            System.err.println("关闭 MinIO 服务时被中断: " + e.getMessage());
            Thread.currentThread().interrupt();
        }
    }

    /**
     * 检查 MinIO 服务是否正在运行
     */
    public static boolean isMinioRunning() {
        return minioProcess != null && minioProcess.isAlive();
    }

    /**
     * 获取进程ID（Java 9+ 支持）
     */
    private static long getProcessId(Process process) {
        try {
            // 使用 Java 9+ 的 Process.getPid() 方法
            java.lang.reflect.Method method = Process.class.getMethod("getPid");
            return (long) method.invoke(process);
        } catch (Exception e) {
            // 回退方案，无法获取真实 PID
            return -1;
        }
    }
}